#ifndef TW_MUTEX_HPP
#define TW_MUTEX_HPP

#include <pthread.h>

namespace TW_Mutex
{
    // 互斥锁
    class CTW_Mutex
    {
        public:
            // 默认构造函数
            CTW_Mutex(void)
            {
                pthread_mutex_init(&m_mutex, NULL);
                m_is_lock = false;
            }
            // 默认析构函数
            ~CTW_Mutex(void)
            {
                if(m_is_lock)
                {
                    UnLock();
                }
                pthread_mutex_destroy(&m_mutex);
            }

        public:
            // 加锁
            void Lock(void)
            {
                pthread_mutex_lock(&m_mutex);
                m_is_lock = true;
            }
            // 解锁
            void UnLock(void)
            {
                m_is_lock = false;
                pthread_mutex_unlock(&m_mutex);
            }

        private:
            pthread_mutex_t m_mutex;    // 锁对象
            bool m_is_lock;             // 锁状态
    };

    // 自动互斥锁
    class CTW_MutexLockGuard
    {
        public:
            CTW_MutexLockGuard(CTW_Mutex* p_mutex)
                : m_p_mutex(p_mutex)
            {
                if(m_p_mutex)
                {
                    m_p_mutex->Lock();
                }
            }
            ~CTW_MutexLockGuard(void)
            {
                if(m_p_mutex)
                {
                    m_p_mutex->UnLock();
                }
            }

        private:
            CTW_Mutex* m_p_mutex;
    };
}

// 默认使用该命名空间
using namespace TW_Mutex;

#endif